package com.aizuda.boot.modules.business.approval.service;

import com.aizuda.boot.modules.business.approval.entity.dto.TaskCenterQueryDTO;
import com.aizuda.boot.modules.business.approval.entity.vo.PendingApprovalTaskVO;
import com.aizuda.boot.modules.flw.entity.vo.TaskApprovalVO;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

/**
 * 任务中心服务接口
 */
public interface TaskCenterService {

    /**
     * 获取当前用户的待审批任务列表
     *
     * @param queryDTO 查询参数
     * @param userId 用户ID
     * @return 待审批任务分页列表
     */
    Page<PendingApprovalTaskVO> getPendingApprovalTasks(TaskCenterQueryDTO queryDTO, Long userId);

    /**
     * 获取当前用户的已处理任务列表
     *
     * @param queryDTO 查询参数
     * @param userId 用户ID
     * @return 已处理任务分页列表
     */
    Page<PendingApprovalTaskVO> getProcessedTasks(TaskCenterQueryDTO queryDTO, Long userId);

    /**
     * 获取当前用户的抄送任务列表
     *
     * @param queryDTO 查询参数
     * @param userId 用户ID
     * @return 抄送任务分页列表
     */
    Page<PendingApprovalTaskVO> getCcTasks(TaskCenterQueryDTO queryDTO, Long userId);

    /**
     * 根据主实例ID和子流程节点获取子流程审批信息
     *
     * @param mainInstanceId 主流程实例ID
     * @param subProcessNodeKey 子流程节点的nodeKey
     * @return 子流程的审批信息
     */
    TaskApprovalVO getSubProcessApprovalInfo(Long mainInstanceId, String subProcessNodeKey);

    // ==================== 性能优化方法 ====================
    
    /**
     * 优化的待审批任务查询 - 使用单次SQL查询替代多次数据库访问和递归查询
     *
     * @param queryDTO 查询参数
     * @param userId 用户ID
     * @return 待审批任务分页列表
     */
    Page<PendingApprovalTaskVO> getPendingApprovalTasksOptimized(TaskCenterQueryDTO queryDTO, Long userId);

    /**
     * 优化的已处理任务查询 - 使用单次SQL查询替代多次数据库访问
     *
     * @param queryDTO 查询参数
     * @param userId 用户ID
     * @return 已处理任务分页列表
     */
    Page<PendingApprovalTaskVO> getProcessedTasksOptimized(TaskCenterQueryDTO queryDTO, Long userId);

    /**
     * 优化的抄送任务查询 - 使用单次SQL查询替代流程引擎API调用和多次数据库访问
     *
     * @param queryDTO 查询参数
     * @param userId 用户ID
     * @return 抄送任务分页列表
     */
    Page<PendingApprovalTaskVO> getCcTasksOptimized(TaskCenterQueryDTO queryDTO, Long userId);
}